#include <iostream>

class Point
{
public:
	double x, y;

	Point() {}

	Point(double x_, double y_)
	{
		x = x_;
		y = y_;
	}

	double sqr_dist(const Point &p) 
	{
		return (x - p.x) * (x - p.x) + (y - p.y) * (y - p.y);
	}
};

class Segment
{
public:
	Point a, b;
	Segment(Point a_, Point b_)
	{
		a.x = a_.x;
		a.y = a_.y;
		b.x = b_.x;
		b.y = b_.y;
	}

	double sqr_dist() 
	{
		return a.sqr_dist(b);
	}
};

double sqr_dist(Segment s, Point p)
{
	double da = p.sqr_dist(s.a), db = p.sqr_dist(s.b);
	double dist = (p.x * (s.b.y - s.a.y) + p.y * (s.a.x - s.b.x) + s.b.x * s.a.y - s.a.x * s.b.y) * 
		(p.x * (s.b.y - s.a.y) + p.y * (s.a.x - s.b.x) + s.b.x * s.a.y - s.a.x * s.b.y) / 
		s.sqr_dist();

	if (da < db)
		return db - dist > s.sqr_dist() ? da : dist;
	else
		return da - dist > s.sqr_dist() ? db : dist;
}

int simple(Point *list, bool *res, double eps, int l, int r)
{
	Segment s = Segment(list[l], list[r]);

	double max = 0;
	int ind = 0;
	for (int i = l + 1; i < r; i++)
	{
		double d = sqr_dist(s, list[i]);
		if (d > eps && max < d)
		{
			ind = i;
			max = d;
		}
	}

	if (max >= eps)
	{
		res[ind] = true;
		return 1 + simple(list, res, eps, l, ind) + simple(list, res, eps, ind, r);
	}
	return 0;
}

int simple(Point *list, bool *res, double eps, int length)
{
	res[0] = true;
	res[length - 1] = true;
	for (int i = 1; i < length - 1; i++) 
		res[i] = false;

	return 2 + simple(list, res, eps, 0, length - 1);
}

int main()
{
	using std::cin;
	using std::cout;

	int n;
	cin >> n;

	Point *list = new Point[n];
	bool *res = new bool[n];
	
	for (int i = 0; i < n; i++)
	{
		res[i] = false;
		cin >> list[i].x >> list[i].y;
	}	
	res[0] = true;
	res[n - 1] = true;

	double eps;
	cin >> eps;

	cout << simple(list, res, eps, n) << "\n";
	for (int i = 1; i <= n; i++)
	{
		if (res[i - 1])
		{
			cout << i << " ";
		}
	}

	delete[] list;
	delete[] res;
}